package com.yxx.strategy.context;

import com.yxx.strategy.UploadStrategy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.Map;

import static com.yxx.enums.UploadModeEnum.getStrategy;

/**
 * 上传策略上下文，负责选择并执行合适的上传策略
 * 策略模式：UploadStrategy 是策略接口，UploadStrategyContext 负责根据不同条件选择策略，执行不同的上传方法。
 * 工厂模式：通过 Map 和 @Resource 注解实现了策略的自动注册，类似于一个工厂自动生成不同策略对象。
 * @author yuxiangxun
 * @date 2025/1/26
 * @apiNote
 */
@Service
public class UploadStrategyContext {
    /**
     * 上传模式
     */
    @Value("${upload.strategy}")
    private String uploadStrategy;

    /**
     * 注入一个名为 uploadStrategyMap 的 Map<String, UploadStrategy>，该 Map 存储了不同的上传策略实现、
     * 工厂模式，通过 Map 和 @Resource 注解实现了策略的自动注册，类似于一个工厂自动生成不同策略对象 通过 Map 的 key 来选择对应的上传策略实现，并执行其中的 uploadFile 方法。
     * 工厂 Map，其中 key 是上传策略的名称，value 是对应的上传策略实现。
     */
    @Resource
    private Map<String, UploadStrategy> uploadStrategyMap;

    /**
     * 上传文件
     * executeUploadStrategy方法接收一个 file 和 path 参数，根据配置的上传策略（通过 uploadStrategy 属性获取）来选择相应的策略
     * @param file 文件
     * @param path 路径
     * @return 文件路径
     */
    public String executeUploadStrategy(MultipartFile file, String path) {
        // getStrategy(uploadStrategy) 获取上传模式对应的上传策略(其实是获取到对应策略的bean名称)  <- 调用上传策略枚举类中的getStrategy方法
        return uploadStrategyMap.get(getStrategy(uploadStrategy)).uploadFile(file,path);
    }



}
